package com.gitee.ed.pattern.proxy;

import java.lang.reflect.Method;

/**
 * 代理拦截器
 *
 * @author hongda.li
 */
public interface ProxyInterceptor<Target> {

    /**
     * 对于给定的方法是否执行拦截
     *
     * @param method 待拦截的方法
     * @return 是否执行拦截
     */
    default boolean doIntercept(Method method) {
        return true;
    }

    /**
     * 在执行真正的逻辑前进行拦截
     * 方法的返回值决定是否继续执行原方法
     *
     * @param invocation 调用信息
     * @return 是否继续执行
     */
    default boolean before(Invocation<Target> invocation) {
        return true;
    }

    /**
     * 当执行成功时进行拦截
     *
     * @param invocation 调用信息
     */
    default void onSuccess(Invocation<Target> invocation) {
    }

    /**
     * 当执行完成时进行拦截
     * 无论执行成功或失败都会调用此方法
     *
     * @param invocation 调用信息
     */
    default void onFinally(Invocation<Target> invocation) {
    }

    /**
     * 当执行失败时进行拦截
     *
     * @param invocation 调用信息
     * @throws Throwable 可能抛出的异常
     */
    default void onFailure(Invocation<Target> invocation) throws Throwable {
        Throwable throwable = invocation.getException();
        if (throwable != null) {
            throw throwable;
        }
    }
}
